package org.example.day05;

import java.util.*;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * 在一棵树中，每个节点代表一个家庭成员，节点的数字表示其个人的财富值，一个节点及其直接相连的子节点被定义为一个小家庭。<br> 现给你一棵树，请计算出最富裕的小家庭的财富和。<br> <div>  <br> </div>
 *
 * 在一棵树中，每个节点代表一个家庭成员，节点的数字表示其个人的财富值，一个节点及其直接相连的子节点被定义为一个小家庭。 现给你一棵树，请计算出最富裕的小家庭的财富和。
 * @date 2024/3/11 15:22
 */


public class test092 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int N = scanner.nextInt();
        int[] wealth = new int[N+1]; // 存储每个成员的财富值
        HashMap<Integer, Integer> familyWealth = new HashMap<>(); // 存储每个父节点和它所有直接子节点的财富和

        // 读取每个成员的财富值
        for (int i = 1; i <= N; i++) {
            wealth[i] = scanner.nextInt();
        }

        // 读取父子关系并计算小家庭的财富和
        for (int i = 0; i < N - 1; i++) {
            int parent = scanner.nextInt();
            int child = scanner.nextInt();

            // 累加子节点的财富到对应的父节点上
            familyWealth.put(parent, familyWealth.getOrDefault(parent, 0) + wealth[child]);
        }

        // 为每个节点（包括单独的成员）加上其自身的财富值
        for (int i = 1; i <= N; i++) {
            familyWealth.put(i, familyWealth.getOrDefault(i, 0) + wealth[i]);
        }

        // 找到最大的财富和
        int maxWealth = 0;
        for (int fw : familyWealth.values()) {
            if (fw > maxWealth) {
                maxWealth = fw;
            }
        }

        // 输出最大财富和
        System.out.println(maxWealth);

        scanner.close();
    }
}

